06 Bash Shell介绍

457次阅读
没有评论

共计 7595 个字符,预计需要花费 19 分钟才能阅读完成。

引入

1. 什么是系统命令

  • Shell 解释器对系统接口的封装
命令控制的方法流程示例:
    ⛅应用程序 --> 系统命令 /shell 命令 --->Shell 解释器 ---> 系统接口 ---> 内核 ---> 硬件
    ⛅系统命令 /Shell 命令 --->Shell 解释器 ---> 系统接口 ---> 内核 ---> 硬件
    ⛅应用程序 ---> 系统命令 /Shell 命令 ---> 系统接口 ---> 内核 ---> 硬件

2. 为何要用系统命令

  • 为了使用计算机

一.Bash Shell 是什么 ?

  • Xshell 是什么?

它是一个远程执行命令的客户端程序, 对应的服务端程序 openssh-server (默认 22 端口)

套接字客户端 ---------------- 网络 ---------------- 套接字服务端
  Xshell                                      openssh-server
远程管理工具
⛅Mac: iTerm2
    打开命令行终端
    ssh root@服务器的 IP 地址
⛅Windows: Xshell
    缓冲区设置: 控制内容显示的行数
    上下翻页: shift + Pg Up
            shift + Pg Dn
  • Shell 是什么?

⛅第一层意思: shell 代表的是解释器, 是对系统接口的封装, 即在系统接口外加了一层壳
            shell 只是一种称呼, 而 Bash 解释器才是具体的一种 Shell
⛅第二层意思: Shell 这门编程语言, (一堆命令及用法)
            用 Shell 程序写出来的程序一般叫做脚本程序
  • posix (了解)

全称 : " 可移植性的操作系统接口 "
Linux 系统支持 "posix", 它是一种规范
Windows 系统部分支持 "posix"
作用: 在于提高应用程序在各种 Unix 操作系统环境之间的可以移植性
  • Bash

 Bash(GNU Bourne-Again Shell) 是许多 Linux 发行版的默认 Shell.
  • shell 是一个命令语言解释器, 在操作系统的最外层, 是用户 (用户程序) 与操作系统 (Linux) 内核的接口程序, 用户输入的每个命令都由 shell 先翻译再传给 Linux 内核, 并将处理后的结果输出至屏幕

06 Bash Shell 介绍

  • 当我们使用远程链接工具连接 Linux 服务时, 系统会打开一个默认的 shell, 我们可以在这个界面执行命令. 比如: 获取当前时间, 创建一个用户, 对文件的增删改查等等.

二.Bash Shell 能做什么?

  • 使用 Shell 可以实现 Linux 系统的大部分管理
1. 文件管理: 创建, 移动, 赋值, 删除, 编辑...
2. 权限管理: 不同用户的不同权限管理.
3. 用户管理: 创建以及删除用户.
4. 磁盘管理: 磁盘挂载.
5. 网络管理: IP 的配置.
6. 软件管理: 下载及运行等等.

三.Shell 提示符

"#" = root 用户(管理员), "$" = 普通用户
[root@shawn /]# whoami // 查看当前用户
root
[root@shawn /]# useradd yanxi // 创建一个用户
[root@shawn /]# passwd yanxi  // 设置 yanxi 的密码
Changing password for user yanxi.
New password:    #// 设置密码
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:     #// 确认密码
passwd: all authentication tokens updated successfully.
[root@shawn /]# su yanxi // 切换到用户 yanxi(超级用户切换普通用户不需要密码)
[yanxi@shawn /]$   #// 符号已变成普通用户符号
[yanxi@shawn /]$ su   #//(普通用户切换到 root 用户需要密码)
Password: 
[root@shawn /]# // 符号已变成 root 用户符号

ps: 🚸交互式与非交互式创建用户

⛅交互式
    # useradd Shawn
    # passwd Shawn
    然后输入密码, 确认密码
⛅非交互式
    # echo "123" | passwd Shawn --stdin(标准输出管道)
    将打印的 "123" 这个结果放入管道 "|" 中, 给 "passwd" 这个命令使用, 一步到位

四.Shell 基础语法

#   命令       选项       参数
# comment  [-options]  [arguments]

⛅命令: 就是一个单词, 对应着一个功能 / 程序, 运行一条命令就启动了一个进程
⛅选项: 对命令的描述, 用于调节命令的输出效果, 控制命令的具体运行
        🔴以“-”引导短格式选项(单个字符),例如“-l”🔴以“--”引导长格式选项(多个字符),例如“--color”🔴多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”⛅参数: 命令操作的对象,如文件、目录名等
注意: 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格. 而命令必须开头,选项和参数位置可以发生变化
#   命令       选项       参数
# comment  [-options]  [arguments]

[root@shawn /]# ls     #命令
    // 显示当前目录下的所有文件以及文件夹
[root@shawn /]# ls -l  #命令 + 选项
    // 以列表的形式显示当前目录下的所有文件以及子文件夹
[root@shawn /]# ls -l /home  #命令 + 选项 + 参数
    // 以列表的形式显示当前目录下的 "home" 目录的所有文件以及子文件夹

 // ls -a -l  (多个短格式)
 // ls -al    (多个短格式写在一起)
 // ls --all  (长格式)
 // --color   

五.Tab 命令补全

  • 在敲命令行时, 有些命令太长不好记, Tab 键可以实现命令补全, 路径补全
  • 在实际的工作中 Tab 键非常用有作用, 因为可以提高执行效率, 减少出错率
# 当你忘记了一条命令的具体单词, 双击 Tab 键可查看你输入单词开头的所有命令
[root@shawn ~]# if
if         ifcfg      ifconfig   ifdown     ifenslave  ifstat     ifup       
[root@shanw ~]# ifc
ifcfg     ifconfig  
[root@shawn ~]# ifco
#这一步按 Tab 键直接补全了 ifconfig 命令
[root@shawn ~]# ifconfig
# 在 Linux 中想要访问的目录较深, 经常的使用 Tab 键补全, 可以提高速度与容错率
#如果路径出错是没有办法补全的
[root@shawn ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33

ps: 更改主机名

# 通过修改文件来永久修改主机名
[root@localhost ~]# vi /etc/hostname  

#通过命令的方式也是永久修改(例外)
[root@localhost ~]# hostnamectl set-hostname [想要的主机名]
[root@localhost ~]# exit
登出
#重新登入即可

六.Shell 的两种使用

1. 命令:

  • 效率低, 适合少量的工作.

2. 脚本(Shell Script):

  • 效率高, 适合重复的大量的工作.
例如: 创建 100 个用户, 如果使用命令就需要执行一百次 useradd, 而脚本值需要几行就可以实现.
[root@Shawn ~]# vim shell_script.sh  // 创建一个脚本文件
按 i // 编辑模式
for i in {1..100}
do
useradd user $i
echo "create user$i"
done

按 Esc  // 退出编辑模式进入命令模式
:wq
[root@Shawn ~]# bash shell_script.sh  // 执行

七.shell 命令行 -- 快捷键

使用 shell 快捷键能极大的提高工作效率

1. 编辑常用命令

Ctrl + a: / 移动到命令行首
Ctrl + e: / 移动到命令行尾
Ctrl + f: / 按照字符一个一个往右移
Ctrl + b: / 按照字符一个一个往左移
Alt + f:// 按单词往右边移动
Alt + b:// 按单词往左边移动
Ctrl + 方向键: / 按单词或空格左右跳
Ctrl + u:// 从光标处删除至命令行首
Ctrl + k:// 从光标处删除至命令行尾
Ctrl + h:// 删除光标前的字符
Ctrl + d:// 有命令字符的情况下删除光标前的字符, 没有字符是登出

2. 历史执行命令

Ctrl + p:// 历史中的上一条命令
Ctrl + n:// 历史中的下一条命令
Ctrl + r:// 逆向搜索命令历史
Ctrl + g:// 从历史搜索模式退出
Alt + .:// 使用上一条命令的最后一个参数

3. 控制命令

Ctrl + l:// 清屏(等同于 clear 命令)
Ctrl + o:// 执行当前命令,并选择上一条命令
Ctrl + s:// 阻止屏幕输出
Ctrl + q:// 允许屏幕输出
Ctrl + c:// 终止前台运行的程序
Ctrl + z:// 将任务暂停, 挂到后台
Ctrl + d:// 登出, 如果命令行有字符则是删除光标后的字符

4. "!" 命令

!!:// 执行上一条命令
!vim:// 执行历史命令中最近的以 vim 开头的命令,如 !ls,!cat...
!$:// 上一条命令的最后一个参数,[与 Alt + . 相同(在 Xshell 中用不了)]
!$:p:// 打印输出 !$ 的内容
!blah:p:// 仅打印输出,而不执行
!*:// 上一条命令的所有参数
!*:p:// 打印输出 !* 的内容
^blah:// 删除上一条命令中的 blah
^blah^foo:// 将上一条命令中的 blah 替换为 foo
^blah^foo^:// 将上一条命令中所有的 blah 都替换为 foo

5. 历史命令 "history"

history       // 查看历史命令
history -d N  // 删除第 N 条历史命令
history -w    // 保存历史命令到文件, 保存到当前用户的家目录(.bash_history)
history -c    // 清空记录, 不会清空文件里的
!!:// 执行上一条命令
!20:// 执行历史命令中的第 20 条
!vim:// 执行历史命令中最近的以 vim 开头的命令,如 !ls,!cat...
!$:// 上一条命令的最后一个参数,[与 Alt + . 相同(在 Xshell 中用不了)]


// 如果想要清空所有你敲的命令就要到 (.bash_history) 文件里面去删除
vi ~/.bash_history
// 历史命令默认保存 1000 条, 可以修改 "/etc/profile" 中的 HISTSIZE=2000

6. 命令别名 "alias"

  • 将复杂的难记的命令简单化
  • "alias 别名 = 命令"
  • "\" : 取消特殊意义, 取消了别名的意义: \ls,
  • 取消别名 : "unalias 别名"
[root@shawn ~]# which [命令]   #查看命令的完整路径
[root@shawn ~]# alias hh='cd /home/shawn'
[root@shawn ~]# hh
[root@shawn shawn]# pwd
/home/shawn
[root@shawn shawn]# unalias hh  #取消别名
[root@shawn shawn]# hh
-bash: hh: 未找到命令
#以上这些都是临时设置
#要想永久设置: 将 "alias 别名 ='想要别名的命令'" 写入 "~/.bashrc"
例子: "alias cat-ens32='cat /etc/sysconfig/network-scripts/ifcfg-ens32'"
  • 取消别名运行的方式
🌞which ls   // 先查看命令的完整路径, 在使用完整路径来运行
🌞\ls        // 反斜杠可以取消特殊意义, 取消 ls 的别名意义
🌞unalias    // 直接取消别名

7. 查看帮助信息

  • man 手册

# man [命令]
# man ls   #查看 ls 命令的手册

一. 按章节来查找
常用的是 1 (命令用法), 5 (文本规范), 8 (系统管理命令)
/usr/bin/passwd      #命令, 修改用户密码 ----man 1 [命令]
/etc/passwd          #保存用户信息文件   ----man 5 [命令]
/etc/exports        #man exports       ----man 5 exports
二. 按关键字来检索 (适合记不住手册全名)
man -k "_selinux"            // 手册名或手册描述中包含关键字_selinux
    🔴这会从 whatish 数据库中去查找
三. 在所有章节中查询
# man -a passwd
# man -f passwd
  • --help

用法: [命令] --help
[root@shawn ~]# ls --help

🌞"ls" 用法: ls [选项]...[文件]...
🌞"ls" 常见选项:
    -a      all, 查看目录下的所有文件, 包括隐藏文件
    -l      长列表显示
    -h      human 一人性化的方式显示出来
    -d      只列出目录名, 不列出其他内容
    -t      按修改时间排序
    -r      逆序排列
    -i      显示文件的 inode 号 (索引号)
  • 参考文档 / 配置模块文件

  • 官方手册

  • baidu 以及 google

八.Bash Shell 命令执行流程

1. 什么是内部命令以及外部命令

  • 内部命令 : shell 程序自带的命令
  • 外部命令 : 在系统 PATH 环境变量中某个路径下的可执行程序

2. 判断是内部命令还是外部命令

//cd 为 shell 内部命令
[root@shawn ~]# type -a cd
cd id=s a shell builtin  //shell 内建
cd is /bin/cd
cd is /bin/usr/cd
//ping 为外部命令, 同时打印出当前命令路径
[root@shawn ~]# type -a ping
ping is /bin/ping
ping is /bin/usr/ping
//hh 为 cd 的别名
[root@shawn ~]# alias hh='cd'
[root@shawn ~]# type -a hh
hh is aliased to 'cd'  //hh 是 cd 的别名

3. 如果是外置命令, Bash 可以通过查找 PATH 变量来获取该命令的绝对路径

# 打印当前环境变量目录
[root@shawn ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

4. 命令缓存: hash 表

  • linux 系统下会有一个 hash 表,当你刚开机时这个 hash 表为空,每当你执行过一条命令时,hash 表会记录下这条命令的路径,就相当于缓存一样

  • 第一次执行命令 shell 解释器默认的会从 PATH 路径下寻找该命令的路径,当你第二次使用该命令时,shell 解释器首先会查看 hash 表,没有该命令才会去 PATH 路径下寻找。

  • 作用: 大大提高命令的调用速率

1. 只要执行外部命令 1 次就会对该命令进行缓存
2. 如果将命令移动了位置,该如何执行
    a. 使用绝对路径执行
    b. 删除 hash 表的缓存指令
// 查找缓存命令所在的路径
[root@shawn ~]# hash
hits     command
   1      /sbin/ifconfig
   2      /bin/systemctl
   7      /bin/ping

// 移动已缓存的命令, 会造成命令无法执行
[root@shawn ~]# ping baidu.com
-bash: /bin/ping: No such file or directory

// 清除 hash 表里其中一条
[root@shawn ~]# hash -d ping

// 清除 hash 表里全部缓存
[root@shawn ~]# hash -r
[root@shawn ~]# hash
hash: hash table empty #显示为空

5. 命令查找优先级

  • 首先判断命令是否通过 绝对路径
  • 判断命令是否有 alias 别名
  • 判断是否是 复合命令(Compound Commands)
  • 判断是否是 函数(function)
  • 判断用户输入的是内部命令还是外部命令
  • ​ 如果是Bash 内部命令直接执行, 外部命令则检测是否存在hash 缓存
  • 最后到 PATH 路径 查找命令, 有就执行, 没有报错: command not found
复合命令: 例:
# for((i=0;i<=3;i++))do echo 1213;done

函数: 例:
# function func(){ echo 123;}
🔴{}左右两边有空格
🔵查看命令所在的位置:# which [命令]

九. 设置时间命令

设置时间的方法有三种

1.Linux 的系统时间

  • 这里说的系统时间说的是 Linux 操作系统维护的时间
🕧查看时间
# date
🕞以自己想要的格式查看时间
# date "+%Y__%m__%d %H::%M::%S"  
🕔自己设置系统时间
# date -s "2050-12-25 12:25:41"   

06 Bash Shell 介绍

2. 硬件时间

  • 硬件时钟是指主机板上的时钟设备,也就是通常可在 BIOS 画面设定的时钟,硬件时间存放于 CMOS 中
🕘查看硬件时间
# hwclock
🕤强制把系统时间写入硬件 (cmos) 中
# hwclock -w
🕤"-s" 相反, 将硬件时间写入系统时间
# hwclock -s

06 Bash Shell 介绍

3.NTP 时间协调服务器

  • ntpdate 命令是使用 NTP 协议来从网络同步时间的命令, NTP(Network Time Protocol) 网络时间协
🕢同步网络时间
# ntpdate ntp1.aliyun.com
🔵查看时间是否更新了
# date
🔵然后将其写入硬件时间把我们之前乱写的时间改回来
# hwclock -w
🍭阿里云提供的 7 个 NTP 时间服务器(Internet 时间同步服务器地址)
ntp1. aliyun. com
ntp2. aliyun. com
ntp3. aliyun. com
ntp4. aliyun. com
ntp5. aliyun. com
ntp6. aliyun. com
ntp7. aliyun. com

06 Bash Shell 介绍

4. 系统时间与硬件时间的关系

🍥这里说的是系统时间,是 linux 由操作系统维护的

🍭硬件时钟是指主机板上的时钟设备,也就是通常可在 BIOS 画面设定的时钟,硬件时间存放于 CMOS 中

🍥系统时钟则是指内核 (kernel) 中的时钟,当 Linux 启动时,Linux 操作 系统将时间从 CMOS 中读到系统时间变量中

🍭之后系统时钟即独立运作, 所有 Linux 相关指令与函数都是读取系统时钟的设定
🍥linux 系统设置硬件时钟时,提供两种时区选择,一种为本地时区,此时硬件时间与系统时间相同

🍭另一种为 UTC 时区,此时硬件时间存的是 UTC 时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间

🍥以后修改时间通过修改系统时间实现, 为了保持系统时间与 CMOS 时间的一致性,Linux 每隔一段时间会
将系统时间写入 CMOS

🍭由于该同步是每隔一段时间(大约是 11 分钟) 进行的,在我们执行 "date -s" 后,如果马上重起机器,修改时间就有可能没有被写入 CMOS

🍥如果要确保修改生效可以执行 "hwclock -w" 将其写入硬盘

十. 重启, 关机, 注销

1. 重启

shutdown -r 10          //10 分钟后重启
shutdown -r 0           // 立即重启
shutdown -r now         // 立即重启
init 6                  // 立即重启
reboot                  // 立即重启

2. 关机

shutdown -h 10          //10 分钟后关机
shutdown -h 0           // 立即关机
shutdown -h now         // 立即关机
init 0                  // 立即关机
halt                    // 立即关机
poweroff                // 立即关机.
  • 取消正在进行的关机或者重启

shutdown -c

3. 注销

1.exit
2.logout
3.Ctrl + C

十一. 查看操作系统版本

// 查看操作系统版本
# cat /etc/redhat-release

// 内核版本
# uname -r
# uname -a

06 Bash Shell 介绍

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计7595字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)